#include <iostream>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;
#include<vector>

// 1.写得很慢，父进程就在等待子进程（阻塞）
// 1.写得很慢，读也需要等待

// 练习：子进程进行写入，父进程进行读取

int main()
{

    // 创建管道
    // 让进程看到同一份代码
    int myfd[2] = {0};

    int n = pipe(myfd); // success 0  erron -1

    if (n < 0)
    {
        cout << "errno," << errno << ":" << strerror(errno) << endl;
        // 报错码以及报错码转换的报错信息
        return 111;
    }
    cout << "myfd[0]:" << myfd[0] << endl; // 读
    cout << "myfd[1]:" << myfd[1] << endl; // 写

    // 创建子进程
    pid_t id = fork();
    assert(id != -1);

    if (id == 0) // 子进程
    {
        // 关闭不需要的文件描述符fd
        close(myfd[0]); // 既然要写就要关掉读的文件描述符

        // 通信开始
          const string str="我是子进程";
          int ret=1;
          char buf[1024];

        
        while (true)
        {
            ////////////////父进程不读，子进程写  |12|
            // char c = 'C';
            // write(myfd[1], &c, sizeof(char));
            // cout << "ret:" << ret++ << endl;
            // sleep(1);
            //////////////////////////////////////

            // snprintf(buf,sizeof (buf) ,"%s,计数器：%d,我的PID:%d\n",str.c_str(),ret++,getpid());
            // write(myfd[1],buf,strlen(buf));
            // sleep(1);
        }

        close(myfd[1]);
        exit(0);
    }

    // 父进程
    close(myfd[0]); // 关闭写

    char buf[1024];
    int ret = 0;
    while (true)
    {
        // sleep(10);  //|12|
        int n = read(myfd[0], buf, sizeof(buf) - 1); // 最后一个读取\0

        if (n > 0)
        {
            buf[n] = '\0';
            cout << "我是父进程，子进程返回信息" << buf << endl;
        }
        else if (n == 0) // 读完了
        {
            cout << "我是父进程，已经到文件结尾了" << endl;
            break;
        }
        else
        {
            cout << "我是父进程，读异常" << endl;
            break;
        }
        sleep(1);
        if (ret++ > 5)
        {
            break;
        }
    }

    close(myfd[0]);
    int status = 0;
    waitpid(id, &status, 0);
    cout << "信号：" << (status & 0x7f) << endl; //输出信号13 

    sleep(100);

    return 0;
}